﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DotLink;
using DotBusiness.Models;
using DotBusiness.Container;
using DotHandler;

namespace DotLink.Controllers
{
    public class CardapioController
    {
        #region Construtores
        #endregion

        #region Propriedades
        #endregion

        #region Métodos

        public JProduto[] adicionarProduto(string nomeProduto, int tempoPreparo, string tipoProduto, string categoria) {
            Produto p = new Produto();
            p.Nome = "J_" + nomeProduto;
            p.Tempo = tempoPreparo;
            p.IdTipo = Bag.F_Tipos.Find("Titulo", tipoProduto).Id;
            p.Categoria = categoria;

            Bag.P_Produtos.Push(p);

            return (JProduto[])Bag.JProdutos_Array();
        }

        public MTipo[] adicionarTipo(string nomeTipo, Double preco) {            
            var exists = Bag.F_Tipos.Find("Titulo", nomeTipo);
            if (exists != null)
                throw new Exception("Tipo já cadastrado");
            
            Tipo t = new Tipo();

            t.Titulo = nomeTipo;
            t.Preco = preco;

            Bag.F_Tipos.Enqueue(t);


            return Bag.MTipos_Array();
        }

        public JProduto[] listarProduto(string nomeProduto, string tipoProduto) {
            JProduto[] jp;
            if (nomeProduto != "")
            {
                jp = (JProduto[])Bag.J_Produtos.Find(true, "Nome", nomeProduto).ToArray();
            }
            else if (tipoProduto != "")
            {
                jp = (JProduto[])Bag.J_Produtos.Find(true, "Tipo", tipoProduto).ToArray();
            }
            else
            {
                jp = (JProduto[])Bag.J_Produtos.ToArray();
            }
            return jp.ToArray();
        }

        public MTipo[] listarTipo(string tipoProduto=null) {
            if (tipoProduto == null)
            {
                return (MTipo[])Bag.MTipos_Array();
            }
            else
            {
                Lista<Tipo> findSet = Bag.F_Tipos.Find(true, "Titulo", tipoProduto);
                var mapSet = findSet.MapTo(typeof(MTipo));
                return (MTipo[])mapSet;
            }
        }

        public string[] comboTipo()
        {
            string[] tipos = new string[Bag.F_Tipos.Quantity];
            int i = 0;
            Bag.F_Tipos.Each((o) =>
            {
                tipos[i] =  o.ToString("Titulo").ToUpper();
                i += 1;
                return true;
            });
            return tipos;
        }

        public dynamic[] excluirProduto(int idProduto) {
            /*
             * cria segunda pilha
             * desempilha produto
             * se produto != idproduto
             * adiciona produto na segunda pilha
             * empilha todos da seugnda pilha de volta
            */
            var isTypeUsed = Bag.L_ProdutosPedidos.Find("IdProduto", idProduto + "");
            if (isTypeUsed != null)
            {
                throw new Exception("Produto em uso, impossível apagar");
                return null;
            }

            Produtos p = new Produtos();
            Produto temp;
            int total = Bag.P_Produtos.Quantity;
            while (total>0)
            {
                temp = Bag.P_Produtos.Pop();
                total -= 1;
                if (Int32.Parse(temp.ToString("Id")) == idProduto)
                {
                    break;
                }
                p.Push(temp, false);
            } ;
            total = p.Quantity;
             while (total>0){
                temp = p.Pop();
                Bag.P_Produtos.Push(temp, false);
                total -= 1;
            }
            return Bag.JProdutos_Array();
        }
        
        public dynamic[] excluirTipo(string idTipoProduto) {
            /*
             * cria uma segunda fila
             * tira produto fila
             * se produto != produto
             * adiciona segunda fila
             * adiciona todos na segunda fila
             * adiciona toda fila na primeira fila
             */
            var isTypeUsed = Bag.P_Produtos.Find("IdTipo", idTipoProduto);
            if (isTypeUsed != null)
            {
                throw new Exception("Tipo em uso, impossível apagar");
            }

            Tipos t = new Tipos();
            Tipo temp = null;
            int total = Bag.F_Tipos.Quantity;
            while (total>0)
            {
                temp = Bag.F_Tipos.Dequeue();
                if (temp.ToString("Id") != idTipoProduto + "")
                {
                    t.Enqueue(temp, false);
                }
                total -= 1;
            }
            total = t.Quantity;
            while (total>0)
            {
                Bag.F_Tipos.Enqueue(t.Dequeue(), false);
                total -= 1;
            };
            return Bag.MTipos_Array();
        }
        #endregion
    }
}
